#include "TComando.h"

int Comando_Crear(TComando* comando, int longitud_maxima) {
	comando->operacion = (char*) malloc(longitud_maxima);
	comando->longitud_maxima = longitud_maxima;

	if (comando->operacion != NULL)
		return COMANDO_OK;
	else
		return COMANDO_ERR_MEMORIA;
}

int Comando_Destruir(TComando* comando) {
	int i;

	if (comando->operacion)
		free(comando->operacion);

	for (i = 0; i < comando->cantidad_argumentos; i++) {
		free(comando->argumentos[i]); /* Valgrind dice: Invalid free() */
	}

	return COMANDO_OK;
}

int str_to_array(char* origen, char* destino[], int* tamanio_array) {
	int size;	
	char* cursor;
	
	cursor = origen;
	*tamanio_array = 0;
	while (*cursor != '\0') {
		for (cursor = origen; *cursor != ' ' && *cursor != '\0'; cursor++);
		if (*origen != ' ') {
			size = cursor - origen;
			destino[*tamanio_array] = malloc(size); /* Valgrind: 10 bytes in 3 blocks are definitely lost in loss record */
			memcpy(destino[*tamanio_array], origen, size);
			(*tamanio_array)++;
		}
		origen = cursor + sizeof(char);
	}
	
	return COMANDO_OK;
}

void parsear_argumentos(TComando* comando, char* argumentos) {
	str_to_array(argumentos, comando->argumentos, &(comando->cantidad_argumentos));	

	if (COMANDO_DEBUG) {
		int i;
		printf("parsear_argumentos:\n comando->cantidad_argumentos = %d\n", comando->cantidad_argumentos);
		for (i = 0; i < comando->cantidad_argumentos; i++) {
			printf(" comando->argumentos[%d] = %s\n", i, comando->argumentos[i]);
		}
	}
}

int Comando_Leer(TComando* comando) {
	char operacion[LONGITUD_MAXIMA];
	char argumentos[LONGITUD_MAXIMA];

	printf("%c ", PROMPT_CHAR);
	scanf("%s", operacion);
/*	sscanf(entrada, "%s", operacion);*/
	strcpy(comando->operacion, operacion);
	/* Workaround para poder aceptar operaciones sin parametros */
	if (strcasecmp(operacion, "RECV") && strcasecmp(operacion, "QUIT") && strcasecmp(operacion, "HELP")) {
	    scanf ("%[A-Z, a-z, 0-9, ]",argumentos);
		/*sscanf(entrada, "%s %[A-Z, a-z, 0-9, ]", operacion, argumentos);*/
		parsear_argumentos(comando, argumentos);
	}

	return COMANDO_OK;
}

int Comando_ObtenerOperacion(TComando* comando, char** operacion) {
	*operacion = comando->operacion;
	return COMANDO_OK;
}

int Comando_ObtenerArgumentos(TComando* comando, int indice, char** argumentos) {
	if (indice >= 0 && indice < comando->cantidad_argumentos) {
		*argumentos = comando->argumentos[indice];
		return COMANDO_OK;
	}
	else {
		return COMANDO_ERR_RANGOINDICE;	
	}
}

